#include "myhead.h"
/*
	写代码的经验技巧：
	    1. 通过写伪代码帮助你去理清整个思路框架，先不必关注细节
*/
struct threadpool
{
	pthread_mutex_t mymutex; //互斥锁
	pthread_cond_t mycond; //条件变量
	pthread_t *id;
	int threadnum;
	int tasknum; //统计当前任务链表中的任务数
	bool shutdown; //标记线程池处于开启还是处于关闭状态
};

struct tasklist
{
	
};

//所有的线程共用同一个任务函数
//从任务链表的头部的下一个节点取出任务然后处理
void *gettask(void *arg)
{
	struct threadpool *q=(struct threadpool *)arg;
	while(1)
	{
		//上锁
		while(q->tasknum<=0&&q->shutdown==false)
		{
			printf("当前线程  %ld 阻塞在wait!\n",pthread_self());
			pthread_cond_wait(); //阻塞
		}
			
		if(q->tasknum<=0&&q->shutdown==true)
		{
			//解锁并退出，防止死锁出现
			break;
		}
		//从头结点的下一个取出任务(删除头结点后面的一个节点)
		q->tasknum--;
		//解锁
		//处理刚才取出来节点(指针p指向这个节点)
		p(参数);
	}
	pthread_exit(NULL);
}
//初始化线程池
struct threadpool *init_pool(int num)
{
	struct threadpool *pool=malloc();
	pthread_mutex_init(&(pool->mymutex),NULL);
	pool->id=malloc(num*sizeof);
	pool->threadnum=num;
	pool->tasknum=0; //最开始任务链表是空的
	pool->shutdown=false; //线程池没有关闭
	for(i=0; i<num;  i++)
		pthread_create(   任务函数gettask,pool);
	return pool;
}

//初始化任务链表的表头
struct tasklist *init_list()
{
	
}

//添加任务
int add_task(什么任务,传递的参数,struct threadpool *somepool)
{
	//准备新的节点
	
	//上锁
	//找到链表的尾部，尾插
	somepool->tasknum++;
	//解锁
	//唤醒线程
	pthread_cond_signal();
}

//销毁线程池
int pool_destroy(struct threadpool *somepool)
{
	//先关闭线程池
	somepool->shutdown=true; //核心代码
	//唤醒所有的线程
	pthread_cond_broadcast(&somepool->mycond); //核心代码
	for(i=0; i<somepool->threadnum; i++)
		pthread_join(somepool->id[i],NULL);
}

void *任务1(void *arg)
{
	//程序员自由发挥
}
int main()
{
	//初始化线程池
	struct threadpool *mypool=init_pool(5);
	
	//初始化任务链表的表头
	init_list();
	//添加任务到链表
	add_task(任务1,参数);
	add_task(任务2,参数);
	add_task(任务3,参数);
	add_task(任务4,参数);
	
	while(1);
	//线程池的销毁(回收线程池中所有的线程)
	//确保任务链表中的所有任务都处理完毕才回收
	//pool_destroy(mypool);
}







